package com.bjpowernode.handler;

import com.bjpowernode.exception.AgeException;
import com.bjpowernode.exception.NameException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.ModelAndView;

/**
 * @ClassName GlobalExceptionHandler
 * @Description
 * @Author hhwu
 * @Date 2022/3/15 13:39
 * Version 1.0
 **/
@ControllerAdvice
public class GlobalExceptionHandler {
    /**
     * @Author hhwu
     * @Description //TODO @ControllerAdvice:控制器增强，给控制器增加异常处理的功能
     * 必须要让框架知道这个注解所在的包名，需要在spring配置文件声明组件扫描器。指定@ControllerAdvice所在的包名
     * 处理异常的方法和控制器的方法定义一样，可以有多个参数，可以用modelandview，string，void，对象类型的返回值
     * @Date 13:40 2022/3/15
     **/
    @ExceptionHandler(value = NameException.class)//value表示当发生此类型异常时，由此方法来处理
    public ModelAndView doNameException(Exception exception) {
        /**
         * @Author hhwu
         * @Description //TODO 处理姓名异常，形参exception表示controller中抛出的异常对象，通过形参可以获取发生的异常信息。
         * 给用户提示
         * @Date 13:46 2022/3/15
         * @Param [ex]
         * @return org.springframework.web.servlet.ModelAndView
         **/
        ModelAndView mv = new ModelAndView();
        mv.addObject("msg", "姓名必须是zs，其他用户不能访问");
        mv.addObject("ex", exception);
        mv.setViewName("nameError");
        return mv;
    }

    @ExceptionHandler(value = AgeException.class)//value表示当发生此类型异常时，由此方法来处理
    public ModelAndView doAgeException(Exception exception) {
        /**
         * @Author hhwu
         * @Description //TODO 处理年龄异常，形参exception表示controller中抛出的异常对象，通过形参可以获取发生的异常信息。
         * 给用户提示
         * @Date 13:46 2022/3/15
         * @Param [ex]
         * @return org.springframework.web.servlet.ModelAndView
         **/
        ModelAndView mv = new ModelAndView();
        mv.addObject("msg", "年龄不为null，且小于80！");
        mv.addObject("ex", exception);
        mv.setViewName("ageError");
        return mv;
    }

    @ExceptionHandler(value = Exception.class)//处理其他未知所有异常
    public ModelAndView doOtherException(Exception exception) {
        /**
         * @Author hhwu
         * @Description //TODO 处理其他未知所有异常
         * 给用户提示
         * @Date 13:46 2022/3/15
         * @Param [ex]
         * @return org.springframework.web.servlet.ModelAndView
         **/
        ModelAndView mv = new ModelAndView();
        mv.addObject("msg", "处理其他异常");
        mv.addObject("ex", exception);
        mv.setViewName("defaultError");
        return mv;
    }
}
